home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / rpg / crossfir.92 / crossfir / crossfire-0.92.5 / server / sounds.c < prev    next >
C/C++ Source or Header  |  1996-07-24  |  4KB  |  179 lines

  1. /*
  2.  * static char *rcsid_sound_c =
  3.  *   "$Id: sounds.c,v 1.9 1995/07/24 22:18:01 master Exp $";
  4.  */
  5.  
  6. /* Send bug reports to Raphael Quinet (quinet@montefiore.ulg.ac.be) */
  7.  
  8. #include <global.h>
  9. #include <sproto.h>
  10. #ifdef SOUND_EFFECTS
  11. #include <sounds.h>
  12. #endif
  13.  
  14. int volume_table[NROF_SOUNDS];
  15. #ifdef SOUND_EFFECTS
  16. RPLAY   *sound_table[NROF_SOUNDS];
  17. #endif
  18.  
  19. void setup_sounds()
  20. {
  21. #ifdef SOUND_EFFECTS
  22.   char  buf[MAX_BUF], name_buf[MAX_BUF];
  23.   FILE *fp;
  24.   int    num_sounds = 0, volume;
  25.  
  26.   LOG(llevDebug, "Setup_sounds()...");
  27.   sprintf(name_buf, "%s/%s", LibDir, SOUNDS_LIST);
  28.   fp = fopen(name_buf, "r");
  29.   if (fp == NULL)
  30.     {
  31.       LOG(llevError, "Could not open file '%s'.\n", name_buf);
  32.       return;
  33.     }
  34.  
  35.   while(fgets(buf, sizeof(buf), fp) != NULL)
  36.     {
  37.       switch(buf[0])
  38.     {
  39.     case '#':
  40.     case '\n':
  41.     case '\0':
  42.     case ' ':
  43.     case '\t':
  44.       continue;
  45.     }
  46.       if (sscanf(buf, "%s %d", name_buf, &volume) < 2)
  47.     volume = -1;
  48.       if (num_sounds >= NROF_SOUNDS)
  49.     {
  50.       LOG(llevError, "Too many sounds in file (max = %d).\n", NROF_SOUNDS);
  51.       break;
  52.     }
  53. #if 0
  54.       LOG(llevDebug, "  Loading sound %d = '%s', volume = %d.\n", num_sounds,
  55.       name_buf, volume);
  56. #endif
  57.       if (volume > 255)
  58.     {
  59.       LOG(llevError, "Invalid sound volume : %d (max = 255).\n",
  60.           volume);
  61.       volume = 255;
  62.     }
  63.       else
  64.     if (volume > 0)
  65.       volume += 27;
  66.       sound_table[num_sounds] = rplay_create(RPLAY_PLAY);
  67.       if (sound_table[num_sounds] == NULL)
  68.     {
  69.       LOG(llevError, "Error in rplay_create.  Out of memory ?\n");
  70.       return;
  71.     }
  72.       volume_table[num_sounds] = volume;
  73.       if (rplay_set(sound_table[num_sounds], RPLAY_APPEND,
  74.             RPLAY_SOUND, name_buf,
  75.             RPLAY_VOLUME, volume,
  76.             NULL) < 0)
  77.     {
  78.       LOG(llevError, "Error in rplay_set for sound '%s'.\n", name_buf);
  79.       return;
  80.     }
  81.       num_sounds++;
  82.     }
  83.   LOG(llevDebug, "done.\n");
  84.   fclose(fp);
  85. #endif
  86. }
  87.  
  88.  
  89. int init_disp_sound(char *player_disp)
  90. {
  91. #ifdef SOUND_EFFECTS
  92.   char *p;
  93.   int   rplay_fd;
  94.   char  hostname[MAX_BUF];
  95.  
  96.   LOG(llevDebug, "Init_disp_sounds(%s)...", player_disp);
  97.   strcpy(hostname, player_disp);
  98.   if ((p = strrchr(hostname, ':')) != NULL)
  99.     *p = '\0';
  100.   if (*hostname == '\0')
  101.     {
  102.       gethostname(hostname, sizeof(hostname));
  103.       LOG(llevDebug, " (hostname = %s) ", hostname);
  104.     }
  105.  
  106.   rplay_fd = rplay_open(hostname);
  107.  
  108.   if (rplay_fd < 0)
  109.     {
  110.       LOG(llevError, "Could not open socket for sounds on '%s'.\n", hostname);
  111.       return 0;
  112.     }
  113.  
  114.   LOG(llevDebug, "done.\n");
  115.   return rplay_fd;
  116. #else
  117.   return 0;
  118. #endif
  119. }
  120.  
  121.  
  122. void play_sound(player *pl, int sound_num, int volume)
  123. {
  124. #ifdef SOUND_EFFECTS
  125.   if (volume > pl->play_count * 8)
  126.     pl->play_count = volume / 8 + 2;
  127.   else
  128.     {
  129. #if 0
  130.       LOG(llevDebug, "Sound %d not played (%d <= %d).\n", sound_num, volume, pl->play_count * 8);
  131. #endif
  132.       return;
  133.     }
  134. #if 0
  135.       LOG(llevDebug, "Playing sound %d (%d > %d).\n", sound_num, volume, pl->play_count * 8);
  136. #endif
  137.   rplay_set(sound_table[sound_num],
  138.         RPLAY_CHANGE, 0, RPLAY_VOLUME, volume,
  139.         NULL);
  140.   rplay(pl->rplay_fd, sound_table[sound_num]);
  141. #endif
  142. }
  143.  
  144.  
  145. void play_sound_player_only(player *pl, int sound_num)
  146. {
  147. #ifdef SOUND_EFFECTS
  148.   if ((sound_num >= NROF_SOUNDS) || (sound_table[sound_num] == NULL))
  149.     {
  150.       LOG(llevDebug, "Sound %d not available.\n", sound_num);
  151.       return;
  152.     }
  153.   if ((pl->rplay_fd > 0) && (volume_table[sound_num] > 0))
  154.     play_sound(pl, sound_num, volume_table[sound_num]);
  155. #endif
  156. }
  157.  
  158.  
  159. void play_sound_map(mapstruct *map, int x, int y, int sound_num)
  160. {
  161. #ifdef SOUND_EFFECTS
  162.   player *pl;
  163.   int volume;
  164.  
  165. #define POW2(x) ((x) * (x))
  166.  
  167.   if ((sound_num >= NROF_SOUNDS) || (sound_table[sound_num] == NULL))
  168.     {
  169.       LOG(llevDebug, "Sound %d not available.\n", sound_num);
  170.       return;
  171.     }
  172.   for (pl = first_player; pl; pl = pl->next)
  173.     if ((pl->ob->map == map) && (pl->rplay_fd > 0) &&
  174.     ((volume = volume_table[sound_num] -
  175.       8 * isqrt(POW2(pl->ob->x - x) + POW2(pl->ob->y - y))) > 0))
  176.       play_sound(pl, sound_num, volume);
  177. #endif
  178. }
  179.